iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0
自我挑戰組

從零開始學Web Framework : React篇系列 第 26

Day_26: 圖片移動由鍵盤操控

  • 分享至 

  • xImage
  •  

1.code

import React, { useState, useEffect } from 'react';
import styles from './ImageKeyboardControl.module.css';
import Image from 'next/image';

function ImageKeyboardControl() {
  const containerWidth = 300;
  const containerHeight = 300;
  const imageSize = 50;
  const [positionX, setPositionX] = useState(0);
  const [positionY, setPositionY] = useState(0);

  useEffect(() => {
    const handleKeyPress = (event) => {
      if (event.key === 'W' || event.key === 'w') {
        setPositionY((prevY) => (prevY - 10 + containerHeight) % containerHeight);
      } else if (event.key === 'S' || event.key === 's') {
        setPositionY((prevY) => (prevY + 10) % containerHeight);
      } else if (event.key === 'A' || event.key === 'a') {
        setPositionX((prevX) => (prevX - 10 + containerWidth) % containerWidth);
      } else if (event.key === 'D' || event.key === 'd') {
        setPositionX((prevX) => (prevX + 10) % containerWidth);
      }
    };

    window.addEventListener('keydown', handleKeyPress);

    return () => {
      window.removeEventListener('keydown', handleKeyPress);
    };
  }, []);

  return (
    <div className={styles.container}>
      <div
        className={`${styles.image}`}
        style={{ left: `${positionX}px`, top: `${positionY}px` }}
      >
        <Image src="/void.png" width={imageSize} height={imageSize} alt="Image" />
      </div>
    </div>
  );
}

export default ImageKeyboardControl;
.container {
    position: relative;
    width: 300px;
    height: 300px;
    overflow: hidden;
    border: 1px solid #ccc;
  }
  
  .image {
    position: absolute;
    transition: left 0.1s, top 0.1s;
  }

2.實作


上一篇
Day_25: 圖片在限定範圍內隨機跳動
下一篇
Day_27: 在特定範圍內追蹤滑鼠
系列文
從零開始學Web Framework : React篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言